package com.xziying.appstore.api.Impl;

import com.xziying.appstore.api.ApiInteractive;
import com.xziying.appstore.api.Request;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * ApiInteractiveImpl
 *
 * @author : xziying
 * @create : 2021-03-20 14:47
 */
public class ApiInteractiveImpl implements ApiInteractive {

    Request request;

    public ApiInteractiveImpl(Request request) {
        this.request = request;
    }

    private String requisition(
            String fromQQ,
            String apiName,
            Object...args
    ){
        try {
            request.requestAPI(request.packageAPI(fromQQ, apiName, args));
            return request.getReply();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "";
    }


    /**
     * 取得好友列表，返回内容#换行符分割
     *
     * @param fromQQ 机器人QQ
     */
    @Override
    public List<String> getFriendList(String fromQQ) {
        try {
            String reply = requisition(fromQQ, "getFriendList");
            String[] split = reply.split("\r\n");
            return Arrays.asList(split);
        } catch (Throwable throwable){
            return new ArrayList<String>();
        }
    }

    @Override
    public synchronized List<String> getGroupList(String fromQQ) {
        try {
            String reply = requisition(fromQQ, "getGroupList");
            String[] split = reply.split("\r\n");
            return Arrays.asList(split);
        } catch (Throwable throwable){
            return new ArrayList<String>();
        }
    }

    @Override
    public synchronized List<String> getTheListOfGroupMembers(String fromQQ, String groupNumber) {
        try {
            String reply = requisition(fromQQ, "getTheListOfGroupMembers", groupNumber);
            String[] split = reply.split("\r\n");
            return Arrays.asList(split);
        } catch (Throwable throwable){
            return new ArrayList<String>();
        }
    }

    /**
     * 取QQ群名
     *
     * @param fromQQ 机器人QQ
     * @param group  群号
     */
    @Override
    public String getGroupName(String fromQQ, String group) {
        try {
            return requisition(fromQQ, "getGroupName", group);
        } catch (Throwable ignored){

        }
        return "";
    }


    @Override
    public synchronized void sendMsg(String fromQQ, int type, String beau, String qq, String msg) {
        try {
            requisition(fromQQ, "sendMsg", type, beau, qq, msg);
        } catch (Throwable ignored){

        }
    }

    /**
     * 发送XML消息
     *
     * @param fromQQ  机器人QQ
     * @param method  1普通 2匿名（匿名需要群开启）
     * @param type    0在线临时会话 1好友 2群 3讨论组 4群临时会话 5讨论组临时会话 7好友验证回复会话
     * @param beau    发送群信息、讨论组、群或讨论组临时会话信息时填写，如发送对象为好友或信息类型是0时可空
     * @param qq      收信对象QQ
     * @param msg     XML代码或Json代码
     * @param subtype 0基本 2点歌
     */
    @Override
    public void sendXml(String fromQQ, int method, int type, String beau, String qq, String msg, int subtype) {
        try {
            requisition(fromQQ, "sendXml", method, type, beau, qq, msg, subtype);
        } catch (Throwable ignored){

        }
    }

    /**
     * 取得机器人网页操作用的Cookies
     *
     * @param fromQQ 机器人QQ
     * @return Cookies
     */
    @Override
    public String getCookies(String fromQQ) {
        try {
            return requisition(fromQQ, "getCookies");
        } catch (Throwable ignored){

        }
        return "";
    }

    /**
     * 邀请对象入群，频率过快会失败
     *
     * @param fromQQ 机器人QQ
     * @param type   0 管理员邀请 1非管理员邀请
     * @param group  被邀请加入的群号
     * @param qq     被邀请人QQ号码（多个号码使用 #换行符(\r\n) 分割）
     */
    @Override
    public void inviteGroup(String fromQQ, int type, String group, String qq) {
        try {
            requisition(fromQQ, "inviteGroup", type, group, qq);
        } catch (Throwable ignored){

        }
    }

    /**
     * 取对象昵称
     *
     * @param fromQQ 机器人QQ
     * @param qq     欲取得的QQ的号码
     */
    @Override
    public String getNick(String fromQQ, String qq) {
        try {
            return requisition(fromQQ, "getNick", qq);
        } catch (Throwable ignored){

        }
        return "";
    }

    /**
     * 取对象群名片
     *
     * @param fromQQ 机器人Q
     * @param group  群号
     * @param qq     欲取得群名片的QQ号码
     */
    @Override
    public String getGroupCard(String fromQQ, String group, String qq) {
        try {
            return requisition(fromQQ, "getGroupCard", group, qq);
        } catch (Throwable ignored){

        }
        return "";
    }

    /**
     * 取对象QQ等级 成功返回等级  失败返回-1
     *
     * @param fromQQ 机器人QQ
     * @param qq     欲取得的QQ的号码
     */
    @Override
    public int getObjLevel(String fromQQ, String qq) {
        try {
            return Integer.parseInt(requisition(fromQQ, "getObjLevel", qq));
        } catch (Throwable ignored){

        }
        return 0;
    }

    /**
     * 查询对象或自己是否被禁言  禁言返回真 失败或未禁言返回假
     *
     * @param fromQQ 机器人QQ
     * @param group  欲查询的群号
     * @param qq     需要查询的对象QQ
     */
    @Override
    public boolean isShutUp(String fromQQ, String group, String qq) {
        try {
            return requisition(fromQQ, "isShutUp", group, qq).equals("真");
        } catch (Throwable ignored){

        }
        return false;
    }

    /**
     * 群内禁言某人
     *
     * @param fromQQ 机器人QQ
     * @param group  欲操作的群号
     * @param qq     欲禁言的对象，如留空且机器人QQ为管理员，将设置该群为全群禁言
     * @param time   0为解除禁言 （禁言单位为秒），如为全群禁言，参数为非0，解除全群禁言为0
     */
    @Override
    public void shutUP(String fromQQ, String group, String qq, String time) {
        try {
            requisition(fromQQ, "shutUP", group, qq, time);
        } catch (Throwable ignored){

        }
    }

    /**
     * 申请加群
     *
     * @param fromQQ 机器人QQ
     * @param group  欲申请加入的群号
     * @param reason 附加理由，可留空（需回答正确问题时，请填写问题答案
     */
    @Override
    public void joinGroup(String fromQQ, String group, String reason) {
        try {
            requisition(fromQQ, "joinGroup", group, reason);
        } catch (Throwable ignored){

        }
    }

    /**
     * 退群
     *
     * @param fromQQ 机器人QQ
     * @param group  欲退出的群号
     */
    @Override
    public void quitGroup(String fromQQ, String group) {
        try {
            requisition(fromQQ, "quitGroup", group);
        } catch (Throwable ignored){

        }
    }

    /**
     * 上传图片，可使用网页链接或本地读入，成功返回该图片GUID，失败返回空
     *
     * @param fromQQ 机器人QQ
     * @param type   1好友、临时会话  2群、讨论组 Ps：好友临时会话用类型 1，群讨论组用类型 2；当填写错误时，图片GUID发送不会成功
     * @param target 上传该图片所属的群号或QQ
     * @param url    图片数据
     */
    @Override
    public void upLoadPic(String fromQQ, int type, String target, String url) {
        try {
            requisition(fromQQ, "upLoadPic", type, target, url);
        } catch (Throwable ignored){

        }
    }

    /**
     * 根据图片GUID取得图片下载连接
     *
     * @param fromQQ 机器人QQ
     * @param type   1 群 讨论组  2临时会话和好友
     * @param target 图片所属对应的群号和好友QQ（可随意乱填写）
     * @param GUID   例如[ER:pic={xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.jpg]
     */
    @Override
    public String getPicLink(String fromQQ, int type, String target, String GUID) {
        try {
            return requisition(fromQQ, "getPicLink", type, target, GUID);
        } catch (Throwable ignored){

        }
        return "";
    }

    /**
     * 发布群公告（成功返回真，失败返回假），调用此API应保证响应QQ为管理员
     *
     * @param fromQQ 机器人QQ
     * @param group  欲发布公告的群号
     * @param title  公告标题
     * @param msg    公告内容
     */
    @Override
    public boolean PBGroupNotic(String fromQQ, String group, String title, String msg) {
        try {
            return requisition(fromQQ, "PBGroupNotic", group, title, msg).equals("真");
        } catch (Throwable ignored){

        }
        return false;
    }

    /**
     * 取群公告，返回该群最新公告
     *
     * @param fromQQ 机器人QQ
     * @param group  欲取得公告的群号
     */
    @Override
    public String getNotice(String fromQQ, String group) {
        try {
            return requisition(fromQQ, "PBGroupNotic", group);
        } catch (Throwable ignored){

        }
        return "";
    }

    /**
     * 向好友发起窗口抖动，调用此Api腾讯会限制频率
     *
     * @param fromQQ 机器人QQ
     * @param qq     接收抖动消息的QQ
     */
    @Override
    public void shakeWindow(String fromQQ, String qq) {
        try {
            requisition(fromQQ, "shakeWindow", qq);
        } catch (Throwable ignored){

        }
    }

    /**
     * 某人请求添加好友验证处理
     *
     * @param fromQQ 机器人QQ
     * @param qq     请求添加好友人QQ
     * @param method 10同意 20拒绝 30忽略
     * @param msg    拒绝添加好友 附加信息
     */
    @Override
    public void handleFriendEvent(String fromQQ, String qq, int method, String msg) {
        try {
            requisition(fromQQ, "handleFriendEvent", qq, method, msg);
        } catch (Throwable ignored){

        }
    }

    /**
     * 某人请求入群 被邀请入群 等 群验证处理
     *
     * @param fromQQ 机器人QQ
     * @param type   213请求入群  214我被邀请加入某群  215某人被邀请加入群
     * @param qq     申请入群、被邀请人的QQ （当请求类型为214时这里为邀请人QQ）
     * @param group  收到请求群号
     * @param seq    收需要处理事件的seq ，这个参数在收到群事件时，ER_原始信息会传递
     * @param method 10同意 20拒绝 30忽略
     * @param msg    拒绝入群附加信息
     */
    @Override
    public void handleGroupEvent(String fromQQ, int type, String qq, String group, String seq, int method, String msg) {
        try {
            requisition(fromQQ, "handleGroupEvent", type, qq, group, seq, method, msg);
        } catch (Throwable ignored){

        }
    }

    /**
     * 修改对象群名片 成功返回真 失败返回假
     *
     * @param fromQQ 机器人QQ
     * @param group  对象所处群号
     * @param qq     被修改名片人QQ
     * @param card   需要修改的名片
     */
    @Override
    public boolean setGroupCard(String fromQQ, String group, String qq, String card) {
        try {
            return requisition(fromQQ, "setGroupCard", group, qq, card).equals("真");
        } catch (Throwable ignored){

        }
        return false;
    }

    /**
     * 将对象移除群
     *
     * @param fromQQ         机器人QQ
     * @param group          被执行群号
     * @param qq             被执行对象
     * @param noLongerAccept 真为不再接收，假为接收
     */
    @Override
    public void kickGroupMBR(String fromQQ, String group, String qq, boolean noLongerAccept) {
        try {
            requisition(fromQQ, "kickGroupMBR", group, qq, noLongerAccept);
        } catch (Throwable ignored){

        }
    }

    /**
     * 获取对象资料 此方式为http，调用时应自行注意控制频率（成功返回JSON格式自行解析）
     *
     * @param fromQQ 响应QQ
     * @param qq     对象QQ
     */
    @Override
    public String getObjInfo(String fromQQ, String qq) {
        try {
            return requisition(fromQQ, "getObjInfo", qq);
        } catch (Throwable ignored){

        }
        return "{}";
    }

    /**
     * 删除好友 成功返回真 失败返回假
     *
     * @param fromQQ 机器人QQ
     * @param qq     被删除对象
     */
    @Override
    public boolean delFriend(String fromQQ, String qq) {
        try {
            return requisition(fromQQ, "delFriend", qq).equals("真");
        } catch (Throwable ignored){

        }
        return false;
    }

    /**
     * 消息撤回（成功返回空，失败返回腾讯给出的理由）（Pro版可用）
     *
     * @param fromQQ 机器人QQ
     * @param group  需撤回消息群号
     * @param serial 需撤回消息序号
     * @param id     需撤回消息ID
     */
    @Override
    public String withdrawMsg(String fromQQ, String group, String serial, String id) {
        try {
            return requisition(fromQQ, "withdrawMsg", group, serial, id);
        } catch (Throwable ignored){

        }
        return "";
    }

    /**
     * 取框架所有QQ号 换行符分割
     *
     * @param type 0取所有 1取在线 2取离线
     */
    @Override
    public String getQQList(int type) {
        try {
            return requisition("", "getQQList", type);
        } catch (Throwable ignored){

        }
        return "";
    }

    /**
     * 加好友,易频繁,有问题验证无法添加
     *
     * @param fromQQ 机器人QQ
     * @param qq     qq
     * @param msg    验证信息
     */
    @Override
    public boolean addFriend(String fromQQ, String qq, String msg) {
        try {
            return requisition(fromQQ, "addFriend", qq, msg).equals("真");
        } catch (Throwable ignored){

        }
        return false;
    }

    /**
     * 向日志窗口发送一条本插件的日志
     *
     * @param msg 任意想输出的文本格式信息
     */
    @Override
    public void outPutLog(String msg) {
        try {
            requisition("", "outPutLog", msg);
        } catch (Throwable ignored){

        }
    }


}
